package mac5855.app.controllers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import mac5855.app.dao.DAOFactory;
import mac5855.app.dao.DenunciaDAO;
import mac5855.app.dao.UsuarioDAO;
import mac5855.app.models.Denuncia;
import mac5855.app.models.Pergunta;
import mac5855.app.models.Resposta;
import mac5855.app.models.Usuario;

/**
 * Servlet Filter implementation class AuthenticationFilter
 */
public class AdminFilter implements Filter {

	public static String USER_KEY = "User";
	public static String USER_TYPE = "UserType";

	public static String FIELD_USER = "username";

	public static String FIELD_PASSWORD = "password";
	/**
	 * Default constructor. 
	 */
	private FilterConfig filterConfig = null;

	public void init(FilterConfig filterConfig) 
	throws ServletException {
		this.filterConfig = filterConfig;
	}
	public void destroy() {
		this.filterConfig = null;
	}


	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		long today = 0;
		//HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		HttpSession session = ((HttpServletRequest) request).getSession();
		String user = (String) session.getAttribute(USER_KEY);
		String tipo = (String) session.getAttribute(USER_TYPE);

		if (user == null) {
			String username = request.getParameter(FIELD_USER);
			String password = request.getParameter(FIELD_PASSWORD);
			String last_logon = request.getParameter("last_logon");
			if(last_logon != null)
				today = Long.parseLong(last_logon);
			/* usuário vindo da tela de Login*/
			if((username != null && password != null) && ( username.length() > 0 )) {
				Usuario usuario = validUser(username, password);
				if(usuario != null ) {
					if(today > usuario.getUltimoLogin().getTime()) {
						usuario.setUltimoLogin(new Date(today));
						UsuarioDAO usuarioDAO = DAOFactory.getDAOFactory(DAOFactory.JDBC).getUsuarioDAO();
						usuarioDAO.updateLastLogon(usuario);
						session.setAttribute(USER_KEY, usuario.getEmail());
						session.setAttribute(USER_TYPE, usuario.getTipo());
						DenunciaDAO dao = DAOFactory.getDAOFactory(DAOFactory.JDBC).getDenunciaDAO();
						Denuncia[] denuncias = dao.findAll();
						request.setAttribute("denuncias", denuncias);
						res.sendRedirect("/sistemaperguntaresposta/admin/");
						return;
					}
					else  
						request.setAttribute("Error", "Session has ended.  Please login.");


				}
				else //Password does not match, i.e., invalid user password
					request.setAttribute("Error", "Invalid password.");


			}
			/* usuário redirecionado para tela de Login */
			res.sendRedirect("/sistemaperguntaresposta/index.jsp");
			return;
		}else
		{
			if(tipo.equals("admin")) {
				DenunciaDAO dao = DAOFactory.getDAOFactory(DAOFactory.JDBC).getDenunciaDAO();
				Denuncia[] denuncias = dao.findAll();
				List<Pergunta> perguntas = new ArrayList<Pergunta>();
				for(Denuncia denuncia:denuncias) {
					if(denuncia.getPergunta() != null)
						perguntas.add(denuncia.getPergunta());
				}
				request.setAttribute("perguntas_denunciadas", (Pergunta[])perguntas.toArray(new Pergunta[perguntas.size()]));

				List<Resposta> respostas = new ArrayList<Resposta>();
				for(Denuncia denuncia:denuncias) {
					if(denuncia.getResposta() != null)
						respostas.add(denuncia.getResposta());
				}
				
				request.setAttribute("respostas_denunciadas", (Resposta[]) respostas.toArray(new Resposta[respostas.size()]));
				chain.doFilter(request, response);
			}
			else
			{
				request.setAttribute("Error", "Você não tem permissão.");
				res.sendRedirect("/sistemaperguntaresposta/index.jsp");
			}
		}
	}

	protected Usuario validUser(String username, String password) {


		UsuarioDAO usuarioDAO = DAOFactory.getDAOFactory(DAOFactory.JDBC).getUsuarioDAO();

		if ((username != null) && (username.length() > 0)) {
			Usuario userFind = new Usuario();
			userFind.setEmail(username);
			userFind.setSenha(password);
			Usuario usuario = usuarioDAO.find(userFind);
			if (usuario != null && usuario.getTipo().equals("admin")) {
				return usuario;
			}

		}

		return null;
	}

}
